package cn.mandifal.manager.service.impl;

import cn.mandifal.manager.service.GoodsCategoryService;
import cn.mandifal.mapper.DpItemCatMapper;
import cn.mandifal.pojo.DpItemCat;
import cn.mandifal.pojo.DpItemCatExample;
import cn.mandifal.pojo.ItemCat;
import cn.mandifal.pojo.ItemCatResult;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import entity.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;

import javax.mail.FetchProfile;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ListIterator;

/**
 * 商品分类管理 实现层
 * @author ws
 */
@Service
@Transactional
public class GoodsCategoryServiceImpl implements GoodsCategoryService {
    @Autowired
    private DpItemCatMapper dpItemCatMapper;
    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 查询所有分类
     * @return 返回分类列表
     */
    @Override
    public List<DpItemCat> findAll() {
        return dpItemCatMapper.selectByExample(null);
    }
    /**
     * 查询商品分类详情
     * @param id
     * @return
     */
    @Override
    public DpItemCat findOne(Long id) {
       return dpItemCatMapper.selectByPrimaryKey(id);
    }

    /**
     * 查询所有,分页显示
     * @param pageNum 页码
     * @param pageSize 页面大小
     * @param parentId 父级 id
     * @return 分页结果
     */
    @Override
    public PageResult findAllByPage(int pageNum, int pageSize,Long parentId) {
        PageHelper.startPage(pageNum,pageSize);
        DpItemCatExample dpItemCatExample=new DpItemCatExample();
        DpItemCatExample.Criteria criteria = dpItemCatExample.createCriteria();
        criteria.andParentIdEqualTo(parentId);
        Page<DpItemCat>page = (Page<DpItemCat>) dpItemCatMapper.selectByExample(dpItemCatExample);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 通过父级 id 查询
     * @param parentid 父类 id
     * @return 商品分类列表
     */
    @Override
    public List<DpItemCat> findByParentId(Long parentid) {
        DpItemCatExample dpItemCatExample=new DpItemCatExample();
        DpItemCatExample.Criteria criteria = dpItemCatExample.createCriteria();
        criteria.andParentIdEqualTo(parentid);
        //根据商品名称缓存商品分类信息
        //得到全部商品分类
        List<DpItemCat> dpItemCatList = findAll();
        //遍历并放入缓存
        for (DpItemCat dpItemCat:dpItemCatList) {
            //将分类名称作为 key，模板 id 作为值
            redisTemplate.boundHashOps("goodsCategory").put(dpItemCat.getName(),dpItemCat.getTypeId());
        }
        return dpItemCatMapper.selectByExample(dpItemCatExample);
    }

    /**
     * 首页显示商品分类列表
     * @return
     */
    @Override
    public List<ItemCatResult> findShowResult() {
        //创建首页分类结果列表
        List<ItemCatResult> itemCatResultList=new ArrayList<>();
        //1.查到所有的 1 级分类
        DpItemCatExample dpItemCatExample1=new DpItemCatExample();
        DpItemCatExample.Criteria criteria1 = dpItemCatExample1.createCriteria();
        criteria1.andParentIdEqualTo(0L);
        //查询一级分类
        List<DpItemCat> list1 = dpItemCatMapper.selectByExample(dpItemCatExample1);
        //遍历一级分类，查询到二级分类
        for (DpItemCat dpItemCat1:list1) {
            ItemCatResult itemCatResult=new ItemCatResult();
            //设置一级分类
            itemCatResult.setDpItemCat(dpItemCat1);
            //1.查到所有的 2 级分类
            DpItemCatExample dpItemCatExample2=new DpItemCatExample();
            DpItemCatExample.Criteria criteria2 = dpItemCatExample2.createCriteria();
            criteria2.andParentIdEqualTo(dpItemCat1.getId());
            //查询二级分类
            List<DpItemCat> list2 = dpItemCatMapper.selectByExample(dpItemCatExample2);
            //遍历二级分类，查询到三级分类
            List<ItemCat> list=new ArrayList();
            for (DpItemCat dpItemCat2:list2) {
                ItemCat itemCat2=new ItemCat();
                //1.查到所有的 2 级分类
                DpItemCatExample dpItemCatExample3=new DpItemCatExample();
                DpItemCatExample.Criteria criteria3 = dpItemCatExample3.createCriteria();
                criteria3.andParentIdEqualTo(dpItemCat2.getId());
                //查询三级分类
                List<DpItemCat> list3 = dpItemCatMapper.selectByExample(dpItemCatExample3);
                //放入三级分类
                itemCat2.setDpItemCatList(list3);
                //放入二级分类
                itemCat2.setDpItemCat(dpItemCat2);
                //添加到列表中
                list.add(itemCat2);
            }
           //将二级分类及三级分类放入
            itemCatResult.setItemCatList(list);
            //放入一级分类
            itemCatResultList.add(itemCatResult);
        }
        return itemCatResultList;
    }

    /**
     * 添加商品分类
     * @param dpItemCat 商品实体
     */
    @Override
    public void add(DpItemCat dpItemCat) {
        dpItemCat.setCreateTime(new Date());
        dpItemCatMapper.insert(dpItemCat);
    }

    /**
     * 更新商品分类
     * @param dpItemCat 商品实体
     */
    @Override
    public void update(DpItemCat dpItemCat) {
        dpItemCat.setUpdateTime(new Date());
        dpItemCatMapper.updateByPrimaryKey(dpItemCat);

    }

    /**
     * 删除商品分类
     * @param ids 商品 id
     */
    @Override
    public void delete(Long[] ids) {
        System.out.println(ids);
        for (Long  id: ids) {
            List<DpItemCat> list = dpItemCatMapper.selectByParentId(id);
            //判断，集合中有元素，说明有下级，不删除
            if (list.size()==0 || list == null){
                dpItemCatMapper.deleteByPrimaryKey(id);

            }
        }
    }

}
